// Copyright 2022 a.o.smith ALL Rights Reserved
package com.liuxinlong.utils;

//import com.aspose.words.*;
//import com.aspose.words.HeaderFooter;
//import com.aspose.words.HorizontalAlignment;
//import com.aspose.words.Paragraph;
//import com.aspose.words.Section;
//import com.aspose.words.VerticalAlignment;
//import com.itextpdf.text.Document;
//import com.itextpdf.text.Font;
//import com.itextpdf.text.Image;
//import com.itextpdf.text.*;
//import com.itextpdf.text.pdf.*;
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
        import sun.misc.BASE64Encoder;

import javax.imageio.ImageIO;

        import java.awt.image.RenderedImage;
import java.io.*;
import java.net.ConnectException;

public class PdfConvertUtils {

    /**
     * @param inputStream  源文件输入流
     * @param outputStream pdf文件输出流
     **/
    public static boolean imgToPdf(InputStream inputStream, OutputStream outputStream) {

//        Document document = null;
//
//        try {
//
//            // 创建文档
//            document = new Document(PageSize.A4, 20, 20, 20, 20);
//
//            // 新建pdf文档,具体逻辑看.getInstance方法
//            PdfWriter.getInstance(document, outputStream);
//
//            document.open();
//            document.newPage();
//
//            // 将文件流转换为字节流，便于格式转换
//            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
//            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
//            byte[] bytes = new byte[1024];
//            int length = 0 ;
//            while (-1 != (length = bufferedInputStream.read(bytes))) {
//                byteArrayOutputStream.write(bytes, 0, length);
//            }
//
//            // 处理img图片
//            Image image = Image.getInstance(byteArrayOutputStream.toByteArray());
//
//            float height = image.getHeight();
//            float width = image.getWidth();
//
//            float percent = 0.0f;
//            if (height > width) {
//                percent = PageSize.A4.getHeight() / height * 100;
//            } else {
//                percent = PageSize.A4.getWidth() / width * 100;
//            }
//
//            image.setAlignment(Image.MIDDLE);
//            image.scalePercent(percent);
//
//            // 将图片放入文档中，完成pdf转换
//            document.add(image);
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        } finally {
//            try {
//                if (document != null) {
//                    document.close();
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }

        return true;
    }

    /**
     * @param inputStream  源文件输入流
     * @param outputStream pdf文件输出流
     **/
//    public static boolean wordTopdfByAspose(InputStream inputStream, OutputStream outputStream) {
//
//        // 验证License 若不验证则转化出的pdf文档会有水印产生
//        if (!getLicense()) {
//            return false;
//        }
//        try {
//            // 将源文件保存在com.aspose.words.Document中，具体的转换格式依靠里面的save方法
//            com.aspose.words.Document doc = new com.aspose.words.Document(inputStream);
//
//            // 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,EPUB, XPS, SWF 相互转换
//            doc.save(outputStream, SaveFormat.PDF);
//
//
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }finally {
//            if (outputStream != null) {
//                try {
//                    outputStream.flush();
//                    outputStream.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//        return true;
//
//    }

    // 官方文档的要求 无需理会
//    public static boolean getLicense() {
//        boolean result = false;
//        try {
//            String s = "<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature></License>";
//            ByteArrayInputStream is = new ByteArrayInputStream(s.getBytes());
//            License aposeLic = new License();
//            aposeLic.setLicense(is);
//            result = true;
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return result;
//    }

    /**
     * @param inputStream  源文件输入流
     * @param outputStream pdf文件输出流
     **/
//    public static boolean excelToPdf(InputStream inputStream, OutputStream outputStream) {
//        // 验证License 若不验证则转化出的pdf文档会有水印产生
//        if (!getExeclLicense()) {
//            return false;
//        }
//        try {
//            Workbook wb = new Workbook(inputStream);// 原始excel路径
//
//            PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();
//            pdfSaveOptions.setOnePagePerSheet(false);
//
//
//            int[] autoDrawSheets={3};
//            //当excel中对应的sheet页宽度太大时，在PDF中会拆断并分页。此处等比缩放。
//            autoDraw(wb,autoDrawSheets);
//
//            int[] showSheets={0};
//            //隐藏workbook中不需要的sheet页。
//            printSheetPage(wb,showSheets);
//            wb.save(outputStream, pdfSaveOptions);
//            outputStream.flush();
//            outputStream.close();
//            System.out.println("完毕");
//        } catch (IOException e) {
//            e.printStackTrace();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return true;
//    }


    /**
     * 设置打印的sheet 自动拉伸比例
     * @param wb
     * @param page 自动拉伸的页的sheet数组
     */
//    public static void autoDraw(Workbook wb,int[] page){
//        if(null!=page&&page.length>0){
//            for (int i = 0; i < page.length; i++) {
//                wb.getWorksheets().get(i).getHorizontalPageBreaks().clear();
//                wb.getWorksheets().get(i).getVerticalPageBreaks().clear();
//            }
//        }
//    }

    /**
     * 隐藏workbook中不需要的sheet页。
     *
     * @param wb
     * @param page 显示页的sheet数组
     */
//    public static void printSheetPage(Workbook wb, int[] page) {
//        for (int i = 1; i < wb.getWorksheets().getCount(); i++) {
//            wb.getWorksheets().get(i).setVisible(false);
//        }
//        if (null == page || page.length == 0) {
//            wb.getWorksheets().get(0).setVisible(true);
//        } else {
//            for (int i = 0; i < page.length; i++) {
//                wb.getWorksheets().get(i).setVisible(true);
//            }
//        }
//    }


    /**
     * @param inputStream  源文件输入流
     * @param outputStream pdf文件输出流
     **/
    public static boolean pptToPdf(InputStream inputStream, OutputStream outputStream) {

//        Document document = null;
//
//        XMLSlideShow slideShow = null;
//
//        PdfWriter pdfWriter = null;
//
//        try {
//            slideShow = new XMLSlideShow(inputStream);
//
//            Dimension dimension = slideShow.getPageSize();
//
//            document = new Document();
//
//            // 新建pdf文件
//            pdfWriter = PdfWriter.getInstance(document, outputStream);
//
//            document.open();
//
//            PdfPTable pdfPTable = new PdfPTable(1);
//
//            List<XSLFSlide> slideList = slideShow.getSlides();
//
//            for (int i = 0, row = slideList.size(); i < row; i++) {
//
//                XSLFSlide slide = slideList.get(i);
//
//                // 设置字体, 解决中文乱码
//                for (XSLFShape shape : slide.getShapes()) {
//                    XSLFTextShape textShape = (XSLFTextShape) shape;
//
//                    for (XSLFTextParagraph textParagraph : textShape.getTextParagraphs()) {
//                        for (XSLFTextRun textRun : textParagraph.getTextRuns()) {
//                            textRun.setFontFamily("宋体");
//                        }
//                    }
//                }
//
//                BufferedImage bufferedImage = new BufferedImage((int)dimension.getWidth(), (int)dimension.getHeight(), BufferedImage.TYPE_INT_RGB);
//
//                Graphics2D graphics2d = bufferedImage.createGraphics();
//
//                graphics2d.setPaint(Color.white);
//                graphics2d.setFont(new java.awt.Font("宋体", java.awt.Font.PLAIN, 12));
//
//                slide.draw(graphics2d);
//
//                graphics2d.dispose();
//
//                Image image = Image.getInstance(bufferedImage, null);
//                image.scalePercent(50f);
//
//                // 写入单元格
//                pdfPTable.addCell(new PdfPCell(image, true));
//                document.add(image);
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        } finally {
//            try {
//                if (document != null) {
//                    document.close();
//                }
//                if (pdfWriter != null) {
//                    pdfWriter.close();
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }

        return true;
    }

    /**
     * office文件转pdf
     *
     * @param officeFile officeFile
     * @param pdfFile pdfFile
     */
    public static void officeToPdf(File officeFile, File pdfFile){
        OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
        try {
            connection.connect();
        } catch (ConnectException e) {
            e.printStackTrace();
        }
        DocumentConverter converter = new OpenOfficeDocumentConverter(
                connection);
        converter.convert(officeFile, pdfFile);
        // close the connection
        connection.disconnect();
    }

    /**
     * pdf文件生成BASE64缩略图
     *
     * @param inputFile 输入文件路径
     * @param outputFile 缩略图输出路径
     * @return 缩略图base64
     */
    public static String generateBookImage(File inputFile, File outputFile) {
        String image64 = "";
        try {
            PDDocument document = PDDocument.load(inputFile);
            PDFRenderer pdfRenderer = new PDFRenderer(document);
            // 提取的页码
            int pageNumber = 0;
            // 以300 dpi 读取存入 BufferedImage 对象
            int dpi = 300;
            RenderedImage buffImage = pdfRenderer.renderImageWithDPI(pageNumber, dpi, ImageType.RGB);
            // 将 BufferedImage 写入到 png
            ImageIO.write(buffImage, "png", outputFile);

            ByteArrayOutputStream baos = new ByteArrayOutputStream();//io流
            try {
                ImageIO.write(buffImage, "png", baos);//写入流中
            } catch (IOException e) {
                e.printStackTrace();
            }
            byte[] bytes = baos.toByteArray();//转换成字节
            BASE64Encoder encoder = new BASE64Encoder();
            String png_base64 = encoder.encodeBuffer(bytes).trim();//转换成base64串
            png_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n
//             image64 = "data:image/png;base64," + png_base64;
            image64 = png_base64;
            // 关闭文档
            document.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return image64;
    }
}
